package com.example.mainserver.task;

import com.example.common.model.Emp;
import com.example.common.model.MailConstants;
import com.example.common.model.MailSendLog;
import com.example.mainserver.mapper.EmpMapper;
import com.example.mainserver.mapper.MailSendLogMapper;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;

@Component
public class MailSendTask {

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Autowired
    MailSendLogMapper mailSendLogMapper;
    @Autowired
    EmpMapper empMapper;

    /**
     * 另外开启一个定时任务，定时任务每隔 10s 就去数据库中捞一次消息，专门去捞那些 status 为 0 并且已经过了 tryTime 时间记录，
     * 把这些消息拎出来后，首先判断其重试次数是否已超过 3 次，如果超过 3 次，则修改该条消息的 status 为 2，表示这条消息发送失败，并且不再重试。
     * 对于重试次数没有超过 3 次的记录，则重新去发送消息，并且为其 count 的值+1。
     */
    @Scheduled(cron = "0/10 * * * * ?")
    public void mailSendTask(){
        // 查出 status 为 0，且 tryTime 大于了当前时间 的消息
        List<MailSendLog> logs = mailSendLogMapper.selectLogsByStatusWithTryTime(MailConstants.DELIVERING,new Date());
        if (logs == null || logs.size() == 0){
            return;
        }
        logs.forEach(log -> {
            Integer count = log.getCount();
            String msgId = log.getMsgId();
            Integer empId = log.getEmpId();
            if (count >= 3){
                mailSendLogMapper.updateStatusByMsgId(msgId,MailConstants.FAILURE);
            }else {
                //重试还没有到达 3 次，继续重试，并更新重试次数
                Emp emp = empMapper.selectOneById(empId);
                CorrelationData data = new CorrelationData(msgId);
                rabbitTemplate.convertAndSend(MailConstants.MAIL_EXCHANGE_NAME,MailConstants.MAIL_ROUTING_KEY_NAME, emp,data);
                //更新重试次数
                mailSendLogMapper.updateCountByMsgId(msgId);

            }
        });
    }

}
